﻿using RS.Echarts.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;

namespace RS.Echarts.Models.Title
{
    /// <summary>
    /// 表示ECharts图表的标题组件配置类。
    /// </summary>
    public class Title
    {
        /// <summary>
        /// 组件ID，默认不指定，指定后可用于在option或者API中引用组件。
        /// </summary>
        public string Id { get; set; }

        /// <summary>
        /// 是否显示标题组件，默认为true。
        /// </summary>
        public bool Show { get; set; } = true;

        /// <summary>
        /// 主标题文本，支持使用\n换行。
        /// </summary>
        public string Text { get; set; } = "";

        /// <summary>
        /// 主标题文本超链接。
        /// </summary>
        public string Link { get; set; } = "";

        /// <summary>
        /// 指定窗口打开主标题超链接，可选值为'self'（当前窗口打开）或'blank'（新窗口打开）。
        /// </summary>
        public string Target { get; set; } = "blank";

        /// <summary>
        /// 主标题文字样式配置。
        /// </summary>
        public TextStyle TextStyle { get; set; } = new TextStyle();

        /// <summary>
        /// 副标题文本，支持使用\n换行。
        /// </summary>
        public string Subtext { get; set; } = "";

        /// <summary>
        /// 副标题文本超链接。
        /// </summary>
        public string Sublink { get; set; } = "";

        /// <summary>
        /// 指定窗口打开副标题超链接，可选值为'self'（当前窗口打开）或'blank'（新窗口打开）。
        /// </summary>
        public string Subtarget { get; set; } = "blank";

        /// <summary>
        /// 副标题文字样式配置。
        /// </summary>
        public TextStyle SubtextStyle { get; set; } = new TextStyle();

        /// <summary>
        /// 整体（包括text和subtext）的水平对齐方式，可选值为'auto'、'left'、'right'、'center'。
        /// </summary>
        public string TextAlign { get; set; } = "auto";

        /// <summary>
        /// 整体（包括text和subtext）的垂直对齐方式，可选值为'auto'、'top'、'bottom'、'middle'。
        /// </summary>
        public string TextVerticalAlign { get; set; } = "auto";

        /// <summary>
        /// 是否触发事件。
        /// </summary>
        public bool TriggerEvent { get; set; }

        /// <summary>
        /// 标题内边距，单位px，默认各方向内边距为5，接受数组分别设定上右下左边距。
        /// 例如：{ 5, 5, 5, 5 }表示上下左右内边距均为5px；{ 5, 10 }表示上下内边距为5px，左右内边距为10px；{ 5, 10, 5, 15 }表示上内边距为5px，右内边距为10px，下内边距为5px，左内边距为15px。
        /// </summary>
        public int[] Padding { get; set; } = new int[] { 5, 5, 5, 5 };

        /// <summary>
        /// 主副标题之间的间距。
        /// </summary>
        public int ItemGap { get; set; } = 10;

        /// <summary>
        /// 所有图形的zlevel值，用于Canvas分层。不同zlevel值的图形会放置在不同的Canvas中，Canvas分层是一种常见的优化手段。
        /// 可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的Canvas会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
        /// zlevel大的Canvas会放在zlevel小的Canvas的上面。
        /// </summary>
        public int Zlevel { get; set; }

        /// <summary>
        /// 组件的所有图形的z值，控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
        /// z相比zlevel优先级更低，而且不会创建新的Canvas。
        /// </summary>
        public int Z { get; set; } = 2;

        /// <summary>
        /// title组件离容器左侧的距离，可以是像20这样的具体像素值，可以是像'20%'这样相对于容器高宽的百分比，也可以是'left'、'center'、'right'。
        /// 如果值为'left'、'center'、'right'，组件会根据相应的位置自动对齐。
        /// </summary>
        public string Left { get; set; } = "auto";

        /// <summary>
        /// title组件离容器上侧的距离，可以是像20这样的具体像素值，可以是像'20%'这样相对于容器高宽的百分比，也可以是'top'、'middle'、'bottom'。
        /// 如果值为'top'、'middle'、'bottom'，组件会根据相应的位置自动对齐。
        /// </summary>
        public string Top { get; set; } = "auto";

        /// <summary>
        /// title组件离容器右侧的距离，可以是像20这样的具体像素值，可以是像'20%'这样相对于容器高宽的百分比。默认自适应。
        /// </summary>
        public string Right { get; set; } = "auto";

        /// <summary>
        /// title组件离容器下侧的距离，可以是像20这样的具体像素值，可以是像'20%'这样相对于容器高宽的百分比。默认自适应。
        /// </summary>
        public string Bottom { get; set; } = "auto";

        /// <summary>
        /// 标题背景色，默认透明。颜色可以使用RGB表示，比如'rgb(128, 128, 128)'，如果想要加上alpha通道，可以使用RGBA，比如'rgba(128, 128, 128, 0.5)'，也可以使用十六进制格式，比如'#ccc'。
        /// </summary>
        public Color BackgroundColor { get; set; } = Colors.Transparent;

        /// <summary>
        /// 标题的边框颜色。支持的颜色格式同BackgroundColor。
        /// </summary>
        public Color BorderColor { get; set; } = Color.FromArgb(255, 204, 204, 204);

        /// <summary>
        /// 标题的边框线宽。
        /// </summary>
        public int BorderWidth { get; set; }

        /// <summary>
        /// 圆角半径，单位px，支持传入数组分别指定4个圆角半径。
        /// 例如：5表示统一设置四个角的圆角大小为5px；{ 5, 5, 0, 0 }表示（顺时针左上，右上，右下，左下）四个角的圆角半径分别为5px、5px、0px、0px。
        /// </summary>
        public int[] BorderRadius { get; set; }

        /// <summary>
        /// 图形阴影的模糊大小。该属性配合shadowColor、shadowOffsetX和shadowOffsetY一起设置图形的阴影效果。
        /// 注意：此配置项生效的前提是，设置了Show为true以及值不为'transparent'的背景色BackgroundColor。
        /// </summary>
        public int ShadowBlur { get; set; }

        /// <summary>
        /// 阴影颜色。支持的格式同Color。注意：此配置项生效的前提是，设置了Show为true。
        /// </summary>
        public Color ShadowColor { get; set; }

        /// <summary>
        /// 阴影水平方向上的偏移距离。注意：此配置项生效的前提是，设置了Show为true。
        /// </summary>
        public int ShadowOffsetX { get; set; }

        /// <summary>
        /// 阴影垂直方向上的偏移距离。注意：此配置项生效的前提是，设置了Show为true。
        /// </summary>
        public int ShadowOffsetY { get; set; }
    }


    /// <summary>
    /// 表示标题组件主标题和副标题的文字样式配置类。
    /// </summary>
    public class TextStyle
    {
        /// <summary>
        /// 文字颜色。
        /// </summary>
        public Color Color { get; set; } = Color.FromArgb(255, 51, 51, 51);

        /// <summary>
        /// 文字字体风格，可选值为'normal'、'italic'、'oblique'。
        /// </summary>
        public string FontStyle { get; set; } = "normal";

        /// <summary>
        /// 文字字体粗细，可选值为'normal'、'bold'、'bolder'、'lighter'或具体数值（如100、200等）。
        /// </summary>
        public string FontWeight { get; set; } = "bolder";

        /// <summary>
        /// 字体系列，如'sans-serif'、'serif'、'monospace'、'Arial'、'Courier New'、'Microsoft YaHei'等。
        /// </summary>
        public string FontFamily { get; set; } = "sans-serif";

        /// <summary>
        /// 字体大小。
        /// </summary>
        public int FontSize { get; set; } = 18;

        /// <summary>
        /// 行高。
        /// </summary>
        public int LineHeight { get; set; }

        /// <summary>
        /// 文本显示宽度。
        /// </summary>
        public int Width { get; set; }

        /// <summary>
        /// 文本显示高度。
        /// </summary>
        public int Height { get; set; }

        /// <summary>
        /// 文字本身的描边颜色。
        /// </summary>
        public Color TextBorderColor { get; set; }

        /// <summary>
        /// 文字本身的描边宽度。
        /// </summary>
        public int TextBorderWidth { get; set; }

        /// <summary>
        /// 文字本身的描边类型，可选值为'solid'、'dashed'、'dotted'或number数组（自v5.0.0开始）。
        /// </summary>
        public string TextBorderType { get; set; } = "solid";

        /// <summary>
        /// 从v5.0.0开始支持，用于设置虚线的偏移量，搭配textBorderType指定dash array实现灵活的虚线效果。
        /// </summary>
        public int TextBorderDashOffset { get; set; }

        /// <summary>
        /// 文字本身的阴影颜色，默认透明。
        /// </summary>
        public Color TextShadowColor { get; set; } = Colors.Transparent;

        /// <summary>
        /// 文字本身的阴影长度。
        /// </summary>
        public int TextShadowBlur { get; set; }

        /// <summary>
        /// 文字本身的阴影X偏移。
        /// </summary>
        public int TextShadowOffsetX { get; set; }

        /// <summary>
        /// 文字本身的阴影Y偏移。
        /// </summary>
        public int TextShadowOffsetY { get; set; }

        /// <summary>
        /// 文字超出宽度是否截断或者换行，配置width时有效，可选值为'truncate'（截断并显示ellipsis配置的文本）、'break'（换行）、'breakAll'（换行，在英语等拉丁文中还会强制单词内换行）。
        /// </summary>
        public string Overflow { get; set; } = "none";

        /// <summary>
        /// 在overflow配置为'truncate'时，可配置末尾显示的文本，默认为'...'。
        /// </summary>
        public string Ellipsis { get; set; } = "...";

        /// <summary>
        /// 富文本样式自定义，以键值对的形式存储不同样式的文本配置。
        /// </summary>
        public Dictionary<string, TextStyle> Rich { get; set; } = new Dictionary<string, TextStyle>();
    }



}
